/*
 * @Author: LVGRAPE
 * @LastEditors: LVGRAPE
 */
#pragma once

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

#include <stdint.h>
#include <stdbool.h>

    /*
    串口发送数据格式（串口波特率19200，1个启始位，1个停止位，其它无）：
    发送间隔40MS，一次发送8个BYTE，
    BYTE[0]:数据头，固定为0X66
    BYTE[1]:AIL——副翼 ： 中间值0x80，左边最大为0x00，右边最大为0xff，即0x00-0x80-0xff线性变化  或 8位标志位
    BYTE[2]:ELE——升降舵：中间值0x80，后最大为0x00，前最大为0xff，即0x00-0x80-0xff线性变化      或 8位标志位
    BYTE[3]:THR——油门：0x00为最小，0xff为最大                                                或 8位标志位
    BYTE[4]:RUDD——方向舵  中间值0x80，左转最大为0x00，右转最大为0xff，即0x00-0x80-0xff线性变化  或 8位标志位
    BYTE[5]:类型位  为0时BYTE[1]到BYTE[4]对应CAMERA_ROLL到CAMERA_YAW,  为1时0时BYTE[1]到BYTE[4]对应CAMREA_FLAG_ONE到CAMREA_FLAG_FOUR
    BYTE[6]=(BYTE[1]^BYTE[2]^BYTE[3]^BYTE[4]^BYTE[5])&0xff;
    BYTE[7]：数据尾，固定为0x99
    BYTE[5]

    */

#define CAMERA_RC_HEADER 0X66 // 数据头，固定为0X66
#define CAMERA_RC_TAIL 0X99   // 数据尾，固定为0x99

    typedef enum camera_rc_flag_info
    {

        CAMERA_CLI = 0,          // 先置1，1秒后置0   校准
        CAMERA_LOCK = 1,         //   先置1，1秒后置0   锁机
        CAMERA_UNLOCK = 2,       //   先置1，1秒后置0  解锁
        CAMERA_FIRE = 3,         // 先置1，1秒后置0   发射
        CAMERA_TAKEOFF = 4,      //    先置1，1秒后置0  一键起飞
        CAMERA_MODE_TENS = 5,    // tens ones   00:无效   01:飞机新手模式/车标准模式  10:飞机标准模式室内/车高速模式  11:飞机标准模式室外/车保留模式
        CAMERA_MODE_ONES = 6,    //
        CAMERA_COMBOS_START = 7, //    编程组合动作开始
        CAMERA_COMBOS_STOP = 8,  //    编程组合动作停止

        CAMERA_COMBOS_MODE = 12,
        // CAMERA_BUCKET_PLUS = 9,    //
        // CAMERA_BUCKET_MINUS = 10,  //
        // CAMERA_SNDARM_PLUS = 11,   //
        // CAMERA_SNDARM_MINUS = 12,  //
        // CAMERA_TRDARM_PLUS = 13,   //
        // CAMERA_TRDARM_MINUS = 14,  //
        // CAMERA_ARMTURN_PLUS = 15,  //
        // CAMERA_ARMTURN_MINUS = 16, //
    } camera_rc_flag_e;

    typedef enum camera_rc_data_index
    {
        CAMERA_HEADER = 0, // 数据头，固定为0X66
        CAMERA_ROLL,       // AIL——副翼 ： 中间值0x80，左边最大为0x00，右边最大为0xff，即0x00-0x80-0xff线性变化
        CAMERA_PITCH,      // ELE——升降舵：中间值0x80，后最大为0x00，前最大为0xff，即0x00-0x80-0xff线性变化
        CAMERA_THROTTLE,   // THR——油门：0x00为最小，0xff为最大
        CAMERA_YAW,        // RUDD——方向舵  中间值0x80，左转最大为0x00，右转最大为0xff，即0x00-0x80-0xff线性变化

        CAMERA_ARM_BUCKET,
        CAMERA_ARM_BIG,
        CAMERA_ARM_SMALL,
        CAMERA_ARM_ROTATE,

        CAMREA_DATA_TYPE,
        CAMERA_CHECK,
        CAMERA_TAIL, // 数据尾，固定为0x99

        CAMREA_FLAG_ONE,   // 操作标志位第一个8位
        CAMREA_FLAG_TWO,   // 操作标志位第二个8位
        CAMREA_FLAG_THREE, //
        CAMREA_FLAG_FOUR,  //

        CAMREA_BLOCKLY_THROTTLE_HIGH_8, //
        CAMREA_BLOCKLY_THROTTLE_LOW_8,
        CAMREA_BLOCKLY_TURN_HIGH_8, //
        CAMREA_BLOCKLY_TURN_LOW_8,  //
        CAMREA_BLOCKLY_SHIFT_HIGH_8,
        CAMREA_BLOCKLY_SHIFT_LOW_8, //
        CAMREA_BLOCKLY_TURRET_PITCH_HIGH_8,
        CAMREA_BLOCKLY_TURRET_PITCH_LOW_8, //
        CAMREA_BLOCKLY_FIRE_HIGH_8,        //
        CAMREA_BLOCKLY_FIRE_LOW_8,
        CAMREA_BLOCKLY_MOVETIME_HIGH_8,  //
        CAMREA_BLOCKLY_MOVETIME_LOW_8,   //
        CAMREA_BLOCKLY_FIRETIME_HIGH_8,  //
        CAMREA_BLOCKLY_FIRETIME_LOW_8,   //
        CAMREA_BLOCKLY_MOTION_GROUP_NUM, //
        CAMREA_BLOCKLY_MOTION_GROUP_MAX,

        CAMREA_MODEL_CATEGORIES, //
        CAMREA_MODEL_SUBCATEGORIES,

        CAMERA_RSSI, // 信号数量
        CAMERA_RC_COUNT,
    } camer_rc_data_index_e;
    typedef enum camera_send_back_data_index
    {
        CAMERA_BACK_HEADER = 0,    // 数据头，固定为0X66
        CAMERA_BACK_TYPE = 1,      // 默认为1，表示回传。 特殊使用：当CAMERA_BACK_TYPE值为0x05，CAMERA_BACK_DATA_TYPE值为0xaa用来重置摄像头模块名字和密码
        CAMERA_BACK_DATA_TYPE = 2, /*默认为0，，传输数据多时，用来设置多组发送。 特殊使用：当CAMERA_BACK_TYPE值为0x05，
                                    CAMERA_BACK_DATA_TYPE值为0xaa用来重置摄像头模块名字和密码*/
        CAMERA_BACK_MAJOR_VER = 5,
        CAMERA_BACK_MINOR_VER = 6,
        CAMERA_BACK_BUILD_NUMBER = 7,
        CAMERA_BACK_CORE_ID = 8,
        CAMERA_BACK_DEV_ID = 9,
        CAMERA_BACK_EQM_ID = 10,
        CAMERA_BACK_FC_FLAG_ERROR_3 = 11,
        CAMERA_BACK_FC_FLAG_ERROR_2 = 12,
        CAMERA_BACK_FC_FLAG_ERROR_1 = 13,
        CAMERA_BACK_FC_FLAG_ERROR_0 = 14,
        CAMERA_BACK_CHECK = 30, // 效验位
        CAMERA_BACK_TAIL = 31,  // 数据头，固定为0X99
    } camer_send_back_data_index_e;
    typedef struct camera_data
    {
        int16_t roll;
        int16_t pitch;
        int16_t yaw;
        int16_t throttle;
        int16_t arm_big;
        int16_t arm_small;
        int16_t arm_rotate;
        int16_t arm_bucket;
        bool emergencyStopTrigger;
        bool unlockTrigger;
        bool footballSuitTrigger; // 1:发射
        bool calibrateTrigger;    // 1:校准
        // uint8_t flag1;
        // uint8_t flag2;
        // uint8_t flag3;
        // uint8_t flag4;
        uint8_t rssi;
        uint32_t flag;
    } camera_data_t;

    typedef enum fc_errors
    {
        FC_ACC_GYRO_HARDFAULT = 0, // 陀螺仪与加速度计错误
        FC_BARO_HARDFAULT,         // 气压计错误
        FC_RC_HARDFAULT,           // 无线模块错误
        FC_OPTICALFLOW_HARDFAULT,  // 光流模块错误
        FC_COMPASS_HARDFAULT,      // 罗盘模块错误
        FC_ACC_CALIBRATING,        // 水平校准带中
        FC_RC_PAIRING,             // 无线对频中
        FC_RC_LOST,                // 无线无信号
        FC_COMPASS_CALIBRATING,    // 罗盘校准中
        FC_STANDBY,                // 一切正常，待机...(新手室内)
        FC_OK_TO_ARM,              // 解锁中
        FC_EMERGENCY_STOP,         // 急停
        FC_ARMED,                  // 解锁了
        FC_ARMING_ALERK,           // 解锁警报
        FC_MODE_STANDARD_INDOOR,   // 标准室内
        FC_MODE_STANDARD_OUTDOOR,  // 标准室外
        FC_LOW_POWER,              // 低电量
        FC_LASER_HARDFAULT,
        FC_ERROR_COUNT,
    } fc_error_e;

    extern camera_data_t camera_rc_data;
    // uint8_t camera_init(SerialHandle_s *UASRTX);
    // uint8_t camera_rc_update(uint8_t *DataFlow);
    // uint8_t get_camera_rc_data(uint8_t index);
    // uint8_t check_camera_rc_flag(uint16_t flag);
    // void CameraRcRemap(void);
    // bool CameraRcIdleDetect(void);
    // void CameraRcRemapFLY(void);
    // uint8_t dataCheck(uint8_t a, uint8_t b);
    // void cameraRcRxHandle(void);
    // void camera_rc_send_back_update(void);
    // extern int16_t cameraChannel[4];
    bool is_camera_combos_trig(void);
    bool is_camera_unlock_trig(void);
    bool is_camera_lock_trig(void);
#ifdef __cplusplus
}
#endif
